/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Base.Dados;
import Base.Pergunta;
import Base.Resposta;
import Base.Tema;
import Controle.ControlePergunta;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rosana
 */
public class DaoDados {
    
    private DaoPergunta dp;
    private DaoResposta dr;
    public DaoDados(){
        dp = new DaoPergunta();
        dr = new DaoResposta();
    }
    
    public ArrayList<Dados> buscarDados()
    {        
        Connection con = FactoryConnection.getConnection();
        ResultSet rs;
        ArrayList<Dados> lista = new ArrayList();
       
        String query = "SELECT t.id as temaId, t.descricao, "
                + "p.id, p.tema, p.pergunta, p.imagem, p.comentario, p.link, "
                + "r.id as respId, r.pergunta as IdPergunta, r.resposta, r.correta "
                + "FROM pergunta p, tema t, resposta r WHERE t.id = p.tema and "
                + "r.pergunta = p.id ORDER BY t.id, p.id, r.id ";
        
        try
        {
            PreparedStatement stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();

            
            if(rs.next())
            {
                do
                {
                    Dados dados = new Dados(new Tema(rs.getInt("temaId"), rs.getString("descricao")), 
                            new Pergunta(rs.getInt("id"), rs.getInt("tema"), rs.getString("pergunta"),
                            rs.getBytes("imagem"), rs.getString("comentario"), rs.getString("link")),
                            new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"), 
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                    dados.setResp2(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                   dados.setResp3(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                    dados.setResp4(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    lista.add(dados);
                }while(rs.next());
            }
                           
        }
        catch (SQLException e)
        {
            System.out.println("Erro no SQL do buscar Dados");
            e.printStackTrace();            
        }
 
        return lista;        
    }
    
     public ArrayList<Pergunta> buscarDados(int code)
    {        
        Connection con = FactoryConnection.getConnection();
        ResultSet rs;
        ArrayList<Pergunta> lista = new ArrayList();
        String query="";
        if(code != -1){
            query = "SELECT p.id, p.tema, p.pergunta, p.imagem, p.comentario, p.link, "
                + "r.id as respId, r.pergunta as IdPergunta, r.resposta, r.correta "
                + "FROM pergunta p, tema t, resposta r WHERE t.id = p.tema and "
                + "r.pergunta = p.id and t.id = ? ORDER BY p.id, r.id ";
        }else{
           query = "SELECT p.id, p.tema, p.pergunta, p.imagem, p.comentario, p.link, "
                + "r.id as respId, r.pergunta as IdPergunta, r.resposta, r.correta "
                + "FROM pergunta p, tema t, resposta r WHERE t.id = p.tema and "
                + "r.pergunta = p.id ORDER BY p.id, r.id "; 
        }
        try
        {
            CallableStatement stmt = con.prepareCall(query);
            if(code != -1){
                stmt.setInt(1, code);
            }
            rs = stmt.executeQuery();

            
            if(rs.next())
            {
                do
                {                   
                    
                    Pergunta perg = new Pergunta(rs.getInt("id"), rs.getInt("tema"), rs.getString("pergunta"),
                            rs.getBytes("imagem"), rs.getString("comentario"), rs.getString("link"));
                    List<Resposta> list = new ArrayList<Resposta>();
                    list.add(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"), 
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                    list.add(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                    list.add(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    rs.next();
                    list.add(new Resposta(rs.getInt("respId"), rs.getInt("IdPergunta"),
                            rs.getString("resposta"), rs.getBoolean("correta")));
                    perg.setRespostas(list);
                    lista.add(perg);
                }while(rs.next());
            }
                           
        }
        catch (SQLException e)
        {
            System.out.println("Erro no SQL do buscar Dados por código de tema");
            e.printStackTrace();            
        }
 
        return lista;        
    }
    

    public boolean delete(Dados sel) {
        
        
        if(dr.excluir(sel.getResp1()))
        {
            if(dr.excluir(sel.getResp2()))
            {
                if(dr.excluir(sel.getResp3()))
                {
                    if(dr.excluir(sel.getResp4()))
                    {
                        if(dp.excluir(sel.getPergunta()))
                        {
                            return true;
                        }
                    }
                }
            }
        }
        return false;       
        
    }

    public int update(Dados dados, String tema, Tema selec, String questao, String coment, 
            String link, String caminho, String optA, String optB, String optC, String optD, String altCor) {
      
        if(selec == null || selec.getId() != dados.getTema().getId())//novo tema cadastrado
        {
            //excluir as respostas e pergunta e inserir novamente os dados
            //motivo: não tenho como fazer update na relação pergunta-tema
            if(!dr.excluirVarios(dados))
            {
                return 5;
            }
            if(!dp.excluir(dados.getPergunta())){
                return 5;
            }
            ControlePergunta cp = new ControlePergunta();
            
            if(selec == null)
            {
                return cp.InsereDB(tema, -1, questao, coment, link, caminho, optA, optB, optC, optD, altCor);
            }
            else
            {
                return cp.InsereDB(tema, selec.getId(), questao, coment, link, caminho, optA, optB, optC, optD, altCor);
            }

        }
        else// não alterou o tema, apenas outros dados 
        {   
            if(altCor.equalsIgnoreCase("A")){
                dr.updateResposta(optA, true, dados.getResp1().getId());
            }else{
                dr.updateResposta(optA, false, dados.getResp1().getId());
            }
            
            if(altCor.equalsIgnoreCase("B")){
                dr.updateResposta(optB, true, dados.getResp2().getId());
            }else{
                dr.updateResposta(optB, false, dados.getResp2().getId());
            }
            
            if(altCor.equalsIgnoreCase("C")){
                dr.updateResposta(optC, true, dados.getResp3().getId());
            }else{
                dr.updateResposta(optC, false, dados.getResp3().getId());
            }
            
            if(altCor.equalsIgnoreCase("D")){
                dr.updateResposta(optD, true, dados.getResp4().getId());
            }else{
                dr.updateResposta(optD, false, dados.getResp4().getId());
            }
            return dp.update(dados, questao, coment, link, caminho);
            
        }       
        
    }

}
